import { NetworkFirewallApp } from './src/app.js';

const app = new NetworkFirewallApp();

// 防止重复关闭
let isShuttingDown = false;

// 优雅关闭处理 - 同步版本
const gracefulShutdown = (signal) => {
  if (isShuttingDown) {
    console.log(`\n⚠️ 已经在关闭过程中，忽略 ${signal} 信号`);
    return;
  }
  
  isShuttingDown = true;
  console.log(`\n🛑 收到 ${signal} 信号，正在同步关闭...`);
  
  try {
    // 同步停止应用
    console.log('📦 正在关闭应用组件...');
    app.stopSync();
    
    console.log('✅ 应用已安全关闭');
    process.exit(0);
    
  } catch (error) {
    console.error('❌ 正常关闭失败:', error);
    
    // 如果正常关闭失败，强制执行系统代理清理
    try {
      console.log('🚨 执行应急系统代理清理...');
      if (app.systemProxyManager) {
        app.systemProxyManager.emergencyRestoreSync();
        console.log('✅ 应急系统代理清理完成');
      }
      
      // 运行应急恢复脚本（同步版本）
      console.log('🔧 运行应急恢复脚本...');
      const { execSync } = require('child_process');
      
      try {
        execSync('node scripts/emergency-restore.js', { 
          cwd: process.cwd(),
          timeout: 5000,
          stdio: 'inherit'
        });
        console.log('✅ 应急恢复脚本执行完成');
      } catch (scriptError) {
        console.warn('⚠️ 应急恢复脚本执行失败:', scriptError.message);
      }
      
    } catch (emergencyError) {
      console.error('❌ 应急清理也失败了:', emergencyError);
      console.log('🔧 请手动清理系统代理设置或运行: node scripts/emergency-restore.js');
    }
    
    process.exit(1);
  }
};

process.on('SIGINT', gracefulShutdown);
process.on('SIGTERM', gracefulShutdown);

// 添加 beforeExit 处理，确保在进程即将退出时清理代理
process.on('beforeExit', async (code) => {
  if (code !== 0) {
    console.log('\n⚠️ 进程即将异常退出，执行最后的代理清理...');
    try {
      if (app.systemProxyManager) {
        await app.systemProxyManager.emergencyRestore();
        console.log('✅ 最后的代理清理完成');
      }
    } catch (error) {
      console.error('❌ 最后的代理清理失败:', error);
    }
  }
});

// 处理未捕获的异常
process.on('uncaughtException', async (error) => {
  console.error('❌ 未捕获的异常:', error);
  try {
    await app.stop();
  } catch (stopError) {
    console.error('❌ 停止应用时发生错误:', stopError);
    // 如果正常停止失败，尝试应急清理系统代理
    try {
      if (app.emergencyCleanupSystemProxy) {
        console.log('🚨 尝试应急清理系统代理...');
        await app.emergencyCleanupSystemProxy();
      }
    } catch (emergencyError) {
      console.error('❌ 应急清理也失败:', emergencyError);
    }
  }
  process.exit(1);
});

process.on('unhandledRejection', async (reason, promise) => {
  console.error('❌ 未处理的Promise拒绝:', reason);
  try {
    await app.stop();
  } catch (stopError) {
    console.error('❌ 停止应用时发生错误:', stopError);
    // 如果正常停止失败，尝试应急清理系统代理
    try {
      if (app.emergencyCleanupSystemProxy) {
        console.log('🚨 尝试应急清理系统代理...');
        await app.emergencyCleanupSystemProxy();
      }
    } catch (emergencyError) {
      console.error('❌ 应急清理也失败:', emergencyError);
    }
  }
  process.exit(1);
});

// 启动应用
async function main() {
  try {
    console.log('🚀 正在启动网络防火墙应用...');
    await app.start();
    
    console.log('\n' + '='.repeat(60));
    console.log('🎉 网络防火墙应用启动成功！');
    console.log('📡 WebSocket服务器: ws://localhost:12290/ws (监听 0.0.0.0:12290)');
    console.log('🌐 HTTP代理服务器: http://localhost:12300 (监听 0.0.0.0:12300)');
    console.log('🔒 HTTPS代理服务器: https://localhost:12310 (监听 0.0.0.0:12310)');
    console.log('🔧 API服务器: http://localhost:12280 (监听 0.0.0.0:12280)');
    console.log('='.repeat(60));
    console.log('\n💡 提示：');
    console.log('  - 应用启动时会自动设置系统代理');
    console.log('  - 关闭应用时会自动恢复原有代理设置');
    console.log('  - 支持完整的HTTP和HTTPS请求拦截');
    console.log('  - 如遇问题可访问 /api/system-proxy/emergency-restore 进行应急恢复');
    console.log('\n按 Ctrl+C 停止应用\n');
    
  } catch (error) {
    console.error('❌ 启动应用失败:', error);
    process.exit(1);
  }
}

main(); 